/* -*-jde-*- */
package app.empresa;

import app.alumnoe.AlumnoE;
import app.conexion.Conexion;
import app.conexion.ConexionException;
import app.util.Fecha;
import app.util.SQLInjectionException;
import app.util.Validator;
import app.util.appException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Bean Vacante Genera una Vacante para la empresa dependiendo del identificador
 * de usuario
 *
 * @author Victor Miguel Peralta Santa Anna
 * @since Enero 2012
 * @version 0.1
 */
public class Vacante {

    /**
     * Identificador de la vacante
     */
    private int nIdVacante;
    /**
     * Identificador del usuario
     */
    private int nIdUsuario;
    /**
     * El título de la vacante
     */
    private String sTituloVacante;
    /**
     * Descripción para la vacante
     */
    private String sDescripcion;
    /**
     * Profesionales que pretende atraer la vacante
     */
    private String sProfesionalesBuscados;
    /**
     * Requisitos para esta vacante
     */
    private String sRequisitos;
    /**
     * Lo que ofrece la vacante
     */
    private String sOfrecen;
    /**
     * Fecha de publicación de la vacante
     */
    private Fecha dFechaPublicacion;
    /**
     * Información de la vacante
     */
    private String sInformacion;
    /**
     * Nombre completo para el contacto de la vacante
     */
    private String sNombreCompletoContacto;
    /**
     * Correo Electronico extra para la vacante
     */
    private String sCorreo;
    /**
     * Telefono extra para la vacante
     */
    private String sTelefono;
    /**
     * La latitud para los puntos geográficos
     */
    private double latitud;
    /**
     * La longitud para los puntos geográficos
     */
    private double longitud;
    /**
     * Si la vacante ofrece o no beca
     */
    private boolean beca;
    /**
     * Si la vacante ofrece o no practicas profesionales
     */
    private boolean practicasProfesionales;
    /**
     * SI la vacante ya esta aprobada por el administrador o no.
     */
    private boolean nActivado;
    /**
     * Guarda el html de las vacantes
     */
    private String htmlVacante;
    /**
     * DistanciaMax
     */
    private double distanciaMax = 0;

    /**
     * Los campos necesarios para dar de alta una vacante
     *
     * @param nIdVacante El identificador de una vacante
     * @param nIdUsuario El identificador de un usuario
     * @param sTituloVacante El título de una vacante
     * @param sDescripcion La descripción de la vacante
     * @param sProfesionalesBuscados Los profesionales que la empresa está
     * buscando
     * @param sRequisitos Los requisitos solicitados tengan los aspirantes al
     * puesto
     * @param sOfrecen Lo que ofrece la vacante
     * @param dFechaPublicacion La fecha de publicación.
     * @param sInformacion La información de la vacanyte
     * @param sNombreCompletoContacto El nombre completo del contacto
     * @param sCorreo El correo electrónico que se deja en la vacante
     * @param sTelefono El teléfono que se deja en la vacante
     * @param latitud La latitud del punto geográfico para la vacante
     * @param longitud La longitud del punto geográfico para la vacante
     * @param beca Si la vacante ofrece o no beca
     * @param practicasProfesionales Si la vacante ofrece o no prácticas
     * profesionales
     * @param nActivado Si la vacante está activa o no por el administrador
     */
    public Vacante(int nIdVacante, int nIdUsuario, String sTituloVacante,
            String sDescripcion, String sProfesionalesBuscados, String sRequisitos,
            String sOfrecen, Fecha dFechaPublicacion, String sInformacion,
            String sNombreCompletoContacto, String sCorreo, String sTelefono,
            double latitud, double longitud, boolean beca, boolean practicasProfesionales,
            boolean nActivado) {
        this.nIdVacante = nIdVacante;
        this.nIdUsuario = nIdUsuario;
        this.sTituloVacante = sTituloVacante;
        this.sDescripcion = sDescripcion;
        this.sProfesionalesBuscados = sProfesionalesBuscados;
        this.sRequisitos = sRequisitos;
        this.sOfrecen = sOfrecen;
        this.dFechaPublicacion = dFechaPublicacion;
        this.sInformacion = sInformacion;
        this.sNombreCompletoContacto = sNombreCompletoContacto;
        this.sCorreo = sCorreo;
        this.sTelefono = sTelefono;
        this.latitud = latitud;
        this.longitud = longitud;
        this.beca = beca;
        this.practicasProfesionales = practicasProfesionales;
        this.nActivado = nActivado;
    }

    /**
     * Construye la vacante a partir del Id de la Vacante.
     *
     * @param nIdVacante El identificador de la vacante.
     */
    public Vacante(int nIdVacante) throws appException {
        try {

            Conexion con = new Conexion();
            this.nIdVacante = nIdVacante;
            String query = "select * from vacantes where nidvacante = " + nIdVacante + ";";
            ResultSet r = con.exec(query);

            while (r.next()) {

                int id1 = r.getInt("nidvacante");
                String s1 = r.getString("stitulovacante");
                String s2 = r.getString("sdescripcion");
                String s3 = r.getString("sprofesionalesbuscados");
                String s4 = r.getString("srequisitos");
                String s5 = r.getString("sofrecen");
                Fecha s6 = new Fecha(r.getString("dfechapublicacion"));
                String s7 = r.getString("sinformacion");
                String s8 = r.getString("snombrecompletocontacto");
                String s9 = r.getString("scorreo");
                String s10 = r.getString("stelefono");
                double s11 = r.getDouble("nlatitud");
                double s12 = r.getDouble("nlongitud");
                boolean s13 = r.getBoolean("bbeca");
                boolean s14 = r.getBoolean("bpracticasprofesionales");
                boolean s15 = r.getBoolean("bactivado");

                String queryEmp = "select * from empresavacantes where nidvacante = " + id1 + ";";
                ResultSet r1 = con.exec(queryEmp);
                r1.next();
                int idemp = r1.getInt("nidusuario");

                this.nIdUsuario = idemp;
                this.sTituloVacante = s1;
                this.sDescripcion = s2;
                this.sProfesionalesBuscados = s3;
                this.sRequisitos = s4;
                this.sOfrecen = s5;
                this.dFechaPublicacion = s6;
                this.sInformacion = s7;
                this.sNombreCompletoContacto = s8;
                this.sCorreo = s9;
                this.sTelefono = s10;
                this.latitud = s11;
                this.longitud = s12;
                this.beca = s13;
                this.practicasProfesionales = s14;
                this.nActivado = s15;

            }

            con.close();

        } catch (SQLException ex) {
            System.err.println(ex);
            Logger.getLogger(Vacante.class.getName()).log(Level.SEVERE, null, ex);
            throw new appException("No se pudo recuperar el elemento: Vacante");
        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudo recuperar el elemento: Vacante");
        }
    }

    /**
     * La representación en cadena del objeto
     *
     * @return
     */
    @Override
    public String toString() {
        return "Vacante{" + "nIdVacante=" + nIdVacante + ", nIdUsuario=" + nIdUsuario
                + ", sTituloVacante=" + sTituloVacante + ", sDescripcion=" + sDescripcion
                + ", sProfesionalesBuscados=" + sProfesionalesBuscados + ", sRequisitos="
                + sRequisitos + ", sOfrecen=" + sOfrecen + ", dFechaPublicacion="
                + dFechaPublicacion + ", sInformacion=" + sInformacion
                + ", sNombreCompletoContacto=" + sNombreCompletoContacto + ", sCorreo="
                + sCorreo + ", sTelefono=" + sTelefono + ", latitud=" + latitud
                + ", longitud=" + longitud + ", beca=" + isBeca() + ", practicasProfesionales="
                + isPracticasProfesionales() + ", nActivado=" + isnActivado() + '}';
    }

    /**
     * Regresa la lista de identificadores de los alumnos postulados a esta
     * vacante
     *
     * @return La lista de identificadores de usuarios
     */
    public LinkedList<Integer> getIdAlumnosPostulados() throws appException {

        try {

            Conexion con = new Conexion();
            String query = "select * from postulados where nidvacante = " + nIdVacante + ";";
            LinkedList<Integer> ids = new LinkedList<Integer>();

            if (!Validator.checkSQLInjection(query)) {
                ResultSet r = con.exec(query);
                while (r.next()) {
                    int idAlumnoE = r.getInt("nidusuario");
                    ids.add(new Integer(idAlumnoE));
                }
            }

            con.close();
            return ids;

        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudieron recuperar los elementos: Alumnos");
        } catch (SQLException sqle) {
            System.err.println(sqle);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, sqle);
            throw new appException("No se pudieron recuperar los elementos: Alumnos");
        } catch (SQLInjectionException sqlie) {
            System.err.println(sqlie);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, sqlie);
            throw new appException(sqlie.getMessage());
        }

    }

    /**
     * Regresa la lista de identificadores de los alumnos postulados a esta
     * vacante
     *
     * @return La lista de identificadores de usuarios
     */
    public LinkedList<AlumnoE> getAlumnosPostulados() throws appException {

        try {

            Conexion con = new Conexion();
            String query = "select * from postulados where nidvacante = " + nIdVacante + ";";
            LinkedList<AlumnoE> ids = new LinkedList<AlumnoE>();

            if (!Validator.checkSQLInjection(query)) {
                ResultSet r = con.exec(query);
                while (r.next()) {
                    int idAlumnoE = r.getInt("nidusuario");

                    AlumnoE alumno = new AlumnoE(idAlumnoE);
                    alumno.generaHTML();
                    ids.add(alumno);
                }
            }
            con.close();

            return ids;

        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudieron recuperar los elementos: Alumnos");
        } catch (SQLException sqle) {
            System.err.println(sqle);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, sqle);
            throw new appException("No se pudieron recuperar los elementos: Alumnos");
        } catch (SQLInjectionException sqlie) {
            System.err.println(sqlie);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, sqlie);
            throw new appException(sqlie.getMessage());
        }
    }

    /**
     * @return the nIdUsuario
     */
    public int getnIdUsuario() {
        return nIdUsuario;
    }

    /**
     * @return the nIdVacante
     */
    public int getnIdVacante() {
        return nIdVacante;
    }

    /**
     * @return the sTituloVacante
     */
    public String getsTituloVacante() {
        return sTituloVacante;
    }

    /**
     * @return the sDescripcion
     */
    public String getsDescripcion() {
        return sDescripcion;
    }

    /**
     * @return the sProfesionalesBuscados
     */
    public String getsProfesionalesBuscados() {
        return sProfesionalesBuscados;
    }

    /**
     * @return the sRequisitos
     */
    public String getsRequisitos() {
        return sRequisitos;
    }

    /**
     * @return the sOfrecen
     */
    public String getsOfrecen() {
        return sOfrecen;
    }

    /**
     * @return the dFechaPublicacion
     */
    public Fecha getdFechaPublicacion() {
        return dFechaPublicacion;
    }

    /**
     * @return the sInformacion
     */
    public String getsInformacion() {
        return sInformacion;
    }

    /**
     * @return the sNombreCompletoContacto
     */
    public String getsNombreCompletoContacto() {
        return sNombreCompletoContacto;
    }

    /**
     * @return the sCorreo
     */
    public String getsCorreo() {
        return sCorreo;
    }

    /**
     * @return the sTelefono
     */
    public String getsTelefono() {
        return sTelefono;
    }

    /**
     * @return the nActivado
     */
    public boolean getnActivado() {
        return isnActivado();
    }

    /**
     * @return the latitud
     */
    public double getLatitud() {
        return latitud;
    }

    /**
     * @return the longitud
     */
    public double getLongitud() {
        return longitud;
    }

    /**
     * @param sTituloVacante the sTituloVacante to set
     */
    public void setsTituloVacante(String sTituloVacante) {
        this.sTituloVacante = sTituloVacante;
    }

    /**
     * @param sDescripcion the sDescripcion to set
     */
    public void setsDescripcion(String sDescripcion) {
        this.sDescripcion = sDescripcion;
    }

    /**
     * @param sProfesionalesBuscados the sProfesionalesBuscados to set
     */
    public void setsProfesionalesBuscados(String sProfesionalesBuscados) {
        this.sProfesionalesBuscados = sProfesionalesBuscados;
    }

    /**
     * @param sRequisitos the sRequisitos to set
     */
    public void setsRequisitos(String sRequisitos) {
        this.sRequisitos = sRequisitos;
    }

    /**
     * @param sOfrecen the sOfrecen to set
     */
    public void setsOfrecen(String sOfrecen) {
        this.sOfrecen = sOfrecen;
    }

    /**
     * @param dFechaPublicacion the dFechaPublicacion to set
     */
    public void setdFechaPublicacion(Fecha dFechaPublicacion) {
        this.dFechaPublicacion = dFechaPublicacion;
    }

    /**
     * @param sInformacion the sInformacion to set
     */
    public void setsInformacion(String sInformacion) {
        this.sInformacion = sInformacion;
    }

    /**
     * @param sNombreCompletoContacto the sNombreCompletoContacto to set
     */
    public void setsNombreCompletoContacto(String sNombreCompletoContacto) {
        this.sNombreCompletoContacto = sNombreCompletoContacto;
    }

    /**
     * @param sCorreo the sCorreo to set
     */
    public void setsCorreo(String sCorreo) {
        this.sCorreo = sCorreo;
    }

    /**
     * @param sTelefono the sTelefono to set
     */
    public void setsTelefono(String sTelefono) {
        this.sTelefono = sTelefono;
    }

    /**
     * @param latitud the latitud to set
     */
    public void setLatitud(double latitud) {
        this.latitud = latitud;
    }

    /**
     * @param longitud the longitud to set
     */
    public void setLongitud(double longitud) {
        this.longitud = longitud;
    }

    /**
     * @return the beca
     */
    public boolean isBeca() {
        return beca;
    }

    /**
     * @param beca the beca to set
     */
    public void setBeca(boolean beca) {
        this.beca = beca;
    }

    /**
     * @return the practicasProfesionales
     */
    public boolean isPracticasProfesionales() {
        return practicasProfesionales;
    }

    /**
     * @param practicasProfesionales the practicasProfesionales to set
     */
    public void setPracticasProfesionales(boolean practicasProfesionales) {
        this.practicasProfesionales = practicasProfesionales;
    }

    /**
     * Guarda el objeto en la base de datos independientemente si éste es nuevo
     * o no.
     */
    public void save() throws appException {

        try {
            Conexion con = new Conexion();

            String query = "select ";
            if (nIdVacante == -1) {
                query += "addVacante(" + nIdUsuario;
                query += ", '" + sTituloVacante + "'";
                query += ", '" + sDescripcion + "'";
                query += ", '" + sProfesionalesBuscados + "'";
                query += ", '" + sRequisitos + "'";
                query += ", '" + sOfrecen + "'";
                query += ", '" + Fecha.getTodayDate().toString() + "'";
                query += ", '" + sInformacion + "'";
                query += ", '" + sNombreCompletoContacto + "'";
                query += ", '" + sCorreo + "'";
                query += ", '" + sTelefono + "'";
                query += ", " + latitud + "";
                query += ", " + longitud + "";
                query += ", " + beca + "";
                query += ", " + practicasProfesionales + "";
                query += ", " + isnActivado() + "";
                query += ");";

                if (!Validator.checkSQLInjection(query)) {
                    ResultSet r = con.exec(query);
                    while (r.next()) {
                        int resultado = r.getInt("addVacante");
                        this.nIdVacante = resultado;
                    }
                }

            } else {

                query += "updateVacante(" + nIdVacante;
                query += ", '" + sTituloVacante + "'";
                query += ", '" + sDescripcion + "'";
                query += ", '" + sProfesionalesBuscados + "'";
                query += ", '" + sRequisitos + "'";
                query += ", '" + sOfrecen + "'";
                query += ", '" + Fecha.getTodayDate().toString() + "'";
                query += ", '" + sInformacion + "'";
                query += ", '" + sNombreCompletoContacto + "'";
                query += ", '" + sCorreo + "'";
                query += ", '" + sTelefono + "'";
                query += ", " + latitud + "";
                query += ", " + longitud + "";
                query += ", " + beca + "";
                query += ", " + practicasProfesionales + "";
                query += ", " + isnActivado() + "";
                query += ");";

                if (!Validator.checkSQLInjection(query)) {
                    con.exec(query);
                }
            }

            con.close();

        } catch (SQLException ex) {
            System.err.println(ex);
            Logger.getLogger(Vacante.class.getName()).log(Level.SEVERE, null, ex);
            throw new appException("No se pudo guardar el elemento: Vacante");
        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudo guardar el elemento: Vacante");
        } catch (SQLInjectionException sqlie) {
            System.err.println(sqlie);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, sqlie);
            throw new appException(sqlie.getMessage());
        }

    }

    /**
     * Borra el objeto de la base de datos.
     */
    public void delete() throws appException {
        try {
            Conexion con = new Conexion();
            String query = "select deleteVacante( " + nIdVacante + " );";
            con.exec(query);
            con.close();
        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudo borrar el elemento: Vacante");
        }
    }

    /**
     * Conexiones de prueba a la base de datos
     *
     * @param args
     * @throws ConexionException
     * @throws SQLException
     * @throws appException
     */
    public static void main(String args[]) throws ConexionException, SQLException, appException {



        //nuevo
        Vacante a = new Vacante(-1, 1, "titulo vacante viejo", "descripcion dela vacante pide C++ ", "profesionales buscadosl",
                "requisitos", "lo que ofrecen", new Fecha("1989-02-16"), "informacion", "nombre completo del contacto",
                "correo electronico", "telefono", 0.15, 0.56, false, true, false);
        a.save();
        // existente
        //Usuario u = new Usuario(2, "nuevo usuario", "washa washa", false, 'a');
        //tc.setsTipocontratacion("a");
        //u.save();

        //a.delete();

        //Vacante a = new Vacante(1);

        LinkedList<Integer> ids = a.getIdAlumnosPostulados();

        System.out.println(ids);



        System.out.println(a);
    }

    /**
     * @return the nActivado
     */
    public boolean isnActivado() {
        return nActivado;
    }

    /**
     * @param nActivado the nActivado to set
     */
    public void setnActivado(boolean nActivado) {
        this.nActivado = nActivado;
    }

    /**
     * @return the htmlVacante
     */
    public String getHtmlVacante() {
        return htmlVacante;
    }

    /**
     * @param htmlVacante the htmlVacante to set
     */
    public void setHtmlVacante(String htmlVacante) {
        this.htmlVacante = htmlVacante;
    }

    public double getDistanciaMax() {
        return distanciaMax;
    }

    public void setDistanciaMax(double distanciaMax) {
        this.distanciaMax = distanciaMax;
    }
}
